package JDK8;

import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class StreamTest {
	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("5的勾股数流：" + getGGStream(5));
		System.out.println("斐波那契数列流：" + getFiboStream().toString());
		System.out.println("标准质数流：" + getPrimeStream().toString());
		System.out.println("判断111是否为质数" + isPrime(111));

	}

	// 一、创建一个勾股数流
	/**
	 * 创建一个勾股数流
	 *
	 * @param maxLength 直角三角形斜边最大值
	 * @return 一个勾股数流
	 */
	public static Stream<int[]> getGGStream(int maxLength) {
		return IntStream.rangeClosed(5, maxLength).boxed()
				.flatMap(c -> IntStream.range(1, c).mapToObj(a -> new double[] { a, Math.sqrt(c * c - a * a), c })
						.filter(t -> t[1] % 1 == 0 && t[0] < t[1]))
				.map(d -> new int[] { (int) d[0], (int) d[1], (int) d[2] });
	}

	// 二、创建一个斐波那契数列流
	/**
	 * 创建一个斐波那契数列流
	 * 
	 * @return 斐波那契数列流
	 */
	public static Stream<Integer> getFiboStream() {
		return Stream.iterate(new int[] { 0, 1 }, t -> new int[] { t[1], t[0] + t[1] }).map(t -> t[0]);
	}

	// 三、创建一个标准质数流
	/**
	 * 创建一个标准质数流
	 * 
	 * @return 标准质数流
	 */
	public static Stream<Integer> getPrimeStream() {
		return Stream.iterate(2, v -> v == 2 ? ++v : v + 2).filter(StreamTest::isPrime);
	}

	/**
	 * 判断指定数是否为质数
	 * 
	 * @param candidate 待判断的数
	 * @return 判断数为质数返回true, 否则返回false
	 */
	public static boolean isPrime(int candidate) {
		return IntStream.rangeClosed(2, (int) Math.sqrt(candidate)).filter(p -> p == 2 || p % 2 == 1)
				.noneMatch(p -> candidate % p == 0);
	}

}
